如何自制一块“树莓派”-DIY ARM-Linux卡片电脑
年前计划拿树莓派做1个小机器人,真正动手的时候发现用别人设计的板子总感觉不是很顺手。
一方面树莓派是面向广大用户的,定制化不够,板子形状尺寸配置外设都无法达到理想的要求;另一方面,树莓派的性能相对…捉急,毕竟成本摆在那,为了普及这块卡片电脑,不可能用上太贵的SOC(树莓派上面的博通CPU是专门供应的)。
于是,为了满足个人的强迫症,也为了学习一下高速PCB的设计制造,决定自己画块ARM核心板玩,开始动手!
造板过程:(拉到文末查看完整演示视频)
第一步,绘制原理图与制作PCB
板子采用全志Cortex A53四核CPU,主频1.5GHz,六层DDR3内存,mini-PCIE尺寸,性能应该是完全超过树莓派了。整块板子引出了SPI,IIC,UART等引脚资源,后面还会做一个Arduino兼容的底板,等板子加工好后移植uboot和Linux-kernel,应该是目前为止最小的Linux开发板。
吐槽:打板难!像这种多层精密PCB板要找到合适的厂家打个样(不是批量)真是不容易。某宝上翻了个遍PCB打样的厂家,没有一家能做0.3mm pitch的BGA板;听说嘉立创可以打样,于是把板子发过去试试看。第一次审核通过,第二次准备加工的时候,接到电话说:你的板子我们做不了,0.2mm的过孔超过工艺范围,是的加钱也做不了!不过幸运的是最终还是找到一个可以做的厂家,当然价格也是相当的不亲民了。
第二步,焊接器件
由于是第一次手工焊接BGA的芯片,而且还是0.3mm pitch的BGA,所以一开始并没有太大的把握。
一般BGA都是让厂家去焊接,因为需要用到专门的吹焊台,可以精确地控制温度曲线。个人寝室是不可能用上这么专业的设备的,所以只能展示一下真正的技术了。
根据各方看到的BGA焊接经验,先对芯片植锡球,就是利用钢网对准焊点后,将锡球(网上很好买,分为各种尺寸,一般按万颗计算的)撒到芯片上,然后加热化锡,这样芯片上的的锡球就成为连接PCB和芯片的导线了,这也是BGA(BallGridArray,焊球阵列封装)的意思。
植锡球的具体操作
买的CPU和DDR芯片是全新的,所以出厂已经植好了锡球,这一步就省略了,当然如果后面一次焊接没有成功,需要吹下来重焊的话,还是需要重新植锡的。我的焊接装备如下:
我采用的焊接方法是:先把除BGA以外别的器件都焊好(主要是电源电路和一些外设),然后上电测试电压(5V、3.3V、1.2V、CPUX的1.3/1.4V)是否正常,正常的话就说明板子成功了一半,因为PCB的加工至少应该是没有问题的(虽然PCB发货前会进行飞针测试,但是只保证通路,短路是很难检查出来的)。
很幸运我这块板子没有发现任何问题,这又说明了我的走线和规则设定是ok的。
核心板背面
焊接完电源及外设器件之后,最重要的CPU和DDR焊接了,这也是最没把握的一步。BGA的引脚完全分布在芯片下方,所以肉眼是看不到的,因此在设计PCB的时候,一定要准确地把芯片边界的丝印画上去,这是用于对齐芯片的唯一标准。对好芯片之后,上风枪加热,用最低档风速,250°进行加热(注意需要吧吹嘴去掉以便增大出风口均匀加热),吹上一分钟左右可以看到芯片有轻微的归位动作,这时候用镊子非常非常小心地碰一碰芯片,能自动归位,就说明基本焊好了。
这里我由于吹焊的操作没有掌握好,吹废了两块板子(原因是温度太高吹太久焊盘脱落了),不过最终还是成功焊好了一片,有了这次的经验,感觉下次吹BGA应该会轻松很多了。
芯片焊好的样子
插上SD卡,USB上电,还没接上SSH呢,已经看到状态LED闪烁了,说明CPU正常启动!至此个人的第一块ARM核心板硬件可以说就圆满成功了。
我的派与硬币与树莓派
第三步,软件移植
保证硬件正常工作后,就该进行软件的移植工作了,U-BOOT和Linux内核的移植和编译在之前等PCB加工的时候已经基本完成,将系统写入SD卡后,插上板子,上电成功进入内核。文件系统使用的Ubuntu16.04,Debian系的最佳选择,跟树莓派也基本完全兼容。下图为通过板载的USB串口进行SSH登陆的效果👇
SSH登陆效果
第四步,设计底板
确定了核心板没问题之后,赶紧画个底板,用于将USB、网口、SPI、IIC等资源都引出来,同时底板上集成了一块Arduino Micro(Mega32U4),通过串口或者IIC和CPU通信(实际上核心板上可以直接运行Linux版的Arduino的IDE给底板上的Arduino下载程序了)。
底板主要通过mini-PCIE的底座将核心板上的IO资源都引出来,比如USB口、以太网口、I2C、SPI、串口、麦克风、喇叭等等。功能比较简单,走线也只需要两层,元件全部放在同一层,省得焊接麻烦。
底板成品
同时底板也板载了一块Mega32U4芯片,烧写Arduino Micro的Bootloader之后可以作为Arduino使用,其中串口和I2C接口都是可以和核心板相连的,用于两者通信,当然核心板上也能直接编译程序给Arduino下载啦。
终板和树莓派的尺寸对比,大概只有一半的大小,还多了很多外设:
我的派与树莓派
由于一般Linux都直接用SSH或者远程桌面登陆,所以底板上没接出HDMI接口(另一个原因是为了关闭GPU降低功耗和发热),所以最好需要一个板载的小屏幕来显示一些信息,比如CPU使用率、温度、IP地址等等。这里我选用一块很常用的OLED12864屏幕,尺寸很小巧显示也很漂亮,通过I2C接口驱动,接线也相当简洁,即插即用。
第五步,实时解码演示
用Linux驱动OLED,和用单片机(比如Arduino)驱动一块OLED有啥不同?首先Linux是一个完整的桌面级操作系统,很多算法(像图像处理,网络应用)都是可以直接移植运行的,所以不会出现像单片机上资源匮乏,每显示一副图片甚至一段中文,都需要事先用PC端软件开好模,再存到单片机的flash里面再下载运行这种情况(因为这Linux板子本身就是个电脑了哈哈);其次Linux是可以多任务的,也就是说可以很方便地将OLED的显示和其他应用结合起来,将屏幕作为一个展示内容的很好工具。例如,下面这个视频,就演示了如何实时解码一段视频(著名的Bad Apple),并经过图像处理后通过OLED来播放:
另外,可以使用Intel的Movidius芯片的bsp合成在板子上,这样就可以做神经网络加速了,完全可以移植几个神经网络算法设计个迷你AI机器人耍耍。把Movidius芯片合成在板子上还是会有一些风险,如果使用Intel的神经计算棒二代NCS2(英特尔® Neural Compute Stick 2 )就比较方便,减少了设计的过程以及出错率。
每一次尝试都有收获——N个第1次成就了这块板
第1次设计高速多层的ARM板就成功,实在是很幸运(当然其实前期也断断续续各种找资料预研了好几个月),回想一下整个设计过程,有太多的不确定因素。
第1次进行多层板设计,而且还是直接上6层。
第1次设计ARM的核心板电路:需要考虑复杂的电源系统、PCB阻抗计算、信号等长走线,EMC优化等等。
第1次进行多层精密PCB的加工投板:6层、3mil线距、0.2mm过孔,价格相比2层板翻了20倍不止就算了,加工好了还不确定是否真的能用。
第1次进行BGA的手工焊接:就算PCB没问题,焊接也是个大问题,一旦焊接完发现板子不工作,很难排查是哪里的原因。
好在以上所有问题都随着板子上那颗可爱的LED闪起来而得到了完美的回答。
本文由达尔闻入驻分享者 稚晖( 个人网站:www.pengzhihui.xyz)提供,妮姐进行编译排版。
达尔闻入驻分享者 稚晖系列——我是稚晖,常驻“达尔闻说”,不定期为大家分享人工智能前沿知识。
稚晖的往期回顾: